昨天我們學會了常數 (constants) 、列舉 (enums) 與變數作用範圍 (scope),今天繼續來學習寫程式一定會遇到的 if ... else 條件判斷吧!
if 中文就是 如果 ,而 if 敘述,直接舉例就是:「如果我中樂透頭獎,我就要環遊世界! ; 如果沒有中樂透,我就繼續努力上班吧QQ」,這句話的意思是,前半句是 true ,也就是說前半句成立(中樂透頭獎或沒中樂透),後半句才會執行(環遊世界或努力上班),而 if 敘述就是如此,以下來看看怎麼把剛剛的話,用 go 寫出來吧!
if <true的運算式> {
<執行的程式碼>
}
範例 1:
package main
import "fmt"
const lotteryNumber int = 4516282935
func main(){
myLotteryNumber := 4516282935
if lotteryNumber == myLotteryNumber{
fmt.Println("環遊世界") // 上述條件成立,故執行這句程式碼
}
if lotteryNumber != myLotteryNumber{
fmt.Println("繼續努力上班吧QQ") // 上述條件不成立,故這句程式碼不會執行到
}
}
範例 1(執行結果):
環遊世界
學會 if 敘述之後,會發現好像不太夠用誒,像是上面的例子,其實可以把兩句話和合併成一句話:「如果我中樂透頭獎,我就要環遊世界!,其他(=如果沒有中樂透),我就繼續努力上班吧QQ」,這時候我們只要加上 else 就可以輕鬆合併成一句話。
if <true的運算式> {
<執行的程式碼>
} else {
<執行的程式碼>
}
範例 2:
package main
import "fmt"
const lotteryNumber int = 4516282935
func main(){
myLotteryNumber := 4516282935
if lotteryNumber == myLotteryNumber{
fmt.Println("環遊世界") // 上述條件成立,故執行這句程式碼
} else {
fmt.Println("繼續努力上班吧QQ") // 其他,執行這句程式碼
}
}
範例 2(執行結果):
環遊世界
像上面的例子,不是中頭獎就是沒中獎(不是 true 就是 false),但很多時候,我們要判定的不只有兩種情形,舉個例子:「如果我中樂透頭獎,我就要環遊世界!; 如果我中樂透二獎,我就要買房子!; 如果沒有中樂透,我就繼續努力上班吧QQ」,這個時候就是 else if 出場的時機,且 else if 可以有很多個。
if <true的運算式> {
<執行的程式碼>
} else if <true的運算式> {
<執行的程式碼>
} else if <true的運算式> {
<執行的程式碼>
... // 可以有很多個 else if
} else {
<執行的程式碼>
}
範例 3:
package main
import "fmt"
const lotteryNumber int = 4516282935
const SecondPrizeNumber int = 4516282934 // 這邊為了簡易 Demo 所以直接訂一個二獎的數字
func main(){
myLotteryNumber := 4516282935
if lotteryNumber == myLotteryNumber{
fmt.Println("環遊世界")
} else if SecondPrizeNumber == myLotteryNumber{
fmt.Println("買房子!")
} else {
fmt.Println("繼續努力上班吧QQ")
}
}
範例 3(執行結果):
環遊世界
補充:
if...else if...else 裡面執行的程式碼,並不會同一時間都執行,若是 if 成立,後面的 else if 跟 else 的程式碼都是不會執行的。想想上面的例子,假如說你只有一張彩卷,你不可能同時中獎又不中獎沒錯吧?!
有時候我們會呼叫某個 function ,拿這個 function 的回傳值來判定他是否正確執行,但判定完成之後這個傳回來的變數就不會用到了,但因為變數還存在他的 scope 裡,所以等於多佔了一個記憶體位置,為了避免佔用記憶體,我們可以使用起始賦值敘述 (init statement) ,讓變數作用範圍只在 if 敘述內有效,離開 if 敘述的 scope ,變數就會消滅。
if <起始賦值敘述>; <true的運算式> {
<執行的程式碼>
}
補充:
true 的運算式內可以使用起始賦值敘述的變數來判斷
i := 0
i := (j+3) == 5
i++
補充:
起始賦值敘述只允許用短變數宣告,不允許用 var 定義變數!
接下來我們在剛剛的範例加一些驗證來實作 if 敘述的起始賦值,驗證如下:
範例 4:
package main
import (
"errors"
"fmt"
)
const lotteryNumber int = 4516282935
const SecondPrizeNumber int = 4516282934 // 這邊為了簡易 Demo 所以直接訂一個二獎的數字
func validate(myLotteryNumber int) error { // 會回傳 error 值的檢查式
if myLotteryNumber%5 == 0 {
return errors.New("我的彩卷號碼不能為 5 的倍數")
} else if myLotteryNumber>9999999999{
return errors.New("我的彩卷號碼須小於等於 9999999999")
} else if myLotteryNumber<1000000000{
return errors.New("我的彩卷號碼須大於等於 1000000000")
} else {
return nil // 檢查通過,回傳 nil
}
}
func main(){
myLotteryNumber := 4516282935
if err := validate(myLotteryNumber); err != nil{
fmt.Println(err) // 若有錯誤印出錯誤訊息
} else if lotteryNumber==myLotteryNumber{
fmt.Println("環遊世界")
} else if SecondPrizeNumber==myLotteryNumber{
fmt.Println("買房子!")
} else {
fmt.Println("繼續努力上班吧QQ")
}
}
範例 4(執行結果):
我的彩卷號碼不能為 5 的倍數
在範例中我們在 function main 用起始賦值定義 err 這個變數,而在 if...else 敘述跑完後, err 變數就可以功成身退,接下來就會被 Go 的記憶體管理系統回收。
今天介紹了在 Go 語言中的 if ... else 敘述條件判斷,雖然 if ... else 跟英文很像所以寫起來很直觀,但有時候又覺得其實有些攏長與囉唆,所以明天要教大家另外一種寫起來更簡潔乾淨的 switch 敘述條件判斷,那我們明天見!